package com.douma._10_day._71;

import java.util.ArrayDeque;

/**
 * @官方网站 : https://douma.ke.qq.com
 * @微信公众号 : 抖码课堂
 * @官方微信号 : bigdatatang01
 * 抖码算法，让算法学习变的简单有趣
 * @作者 : 老汤
 */
public class _71_simplify_path {
    /* leetcode 71 号算法题：简化路径
    给你一个字符串 path ，表示指向某一文件或目录的 Unix 风格 绝对路径 （以 '/' 开头），
    请你将其转化为更加简洁的规范路径。
        - 在 Unix 风格的文件系统中，一个点（.）表示当前目录本身；
        - 此外，两个点 （..） 表示将目录切换到上一级（指向父目录）
        - 两者都可以是复杂相对路径的组成部分
        - 任意多个连续的斜杠（即，'//'）都被视为单个斜杠 '/'
        - 对于此问题，任何其他格式的点（例如，'...'）均被视为文件/目录名称。
    请注意，返回的 规范路径 必须遵循下述格式：
        - 始终以斜杠 '/' 开头。
        - 两个目录名之间必须只有一个斜杠 '/' 。
        - 最后一个目录名（如果存在）不能 以 '/' 结尾。
        - 此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。
    返回简化后得到的 规范路径 。

        /home/  --> /home  注意，最后一个目录名后面没有斜杠。
        /../    --> /  从根目录向上一级是不可行的，因为根目录是你可以到达的最高级。
        /a/./b/../../c/  --> /c
     */

    public String simplifyPath(String path) {
        String[] dirs = path.split("/");
        ArrayDeque<String> stack = new ArrayDeque<>();
        for (String dir : dirs) {
            if (dir.equals("") || dir.equals(".")) {
                continue;
            } else if (dir.equals("..") && stack.isEmpty()) {
                continue;
            } else if (dir.equals("..") && !stack.isEmpty()) {
                stack.pop();
            } else {
                stack.push(dir);
            }
        }
        if (stack.isEmpty()) return "/";
        StringBuilder sb = new StringBuilder();
        while (!stack.isEmpty()) {
            sb.append("/");
            sb.append(stack.removeLast());
        }
        return sb.toString();
    }
}
